#!/usr/bin/env python
"""
简化版 MD2PPT API 同步脚本
适用于已经有运行中的API服务器的情况
"""

import json
import requests
from pathlib import Path
from datetime import datetime
import argparse
import sys

def fetch_and_save_openapi(base_url="http://localhost:8001", output_dir="./api_docs"):
    """获取并保存 OpenAPI 规范"""
    
    output_dir = Path(output_dir)
    output_dir.mkdir(exist_ok=True)
    
    openapi_url = f"{base_url}/openapi.json"
    
    print(f"📥 获取 OpenAPI 规范: {openapi_url}")
    
    try:
        response = requests.get(openapi_url, timeout=10)
        response.raise_for_status()
        
        openapi_data = response.json()
        api_info = openapi_data.get('info', {})
        
        print(f"✅ 获取成功")
        print(f"   API: {api_info.get('title', 'Unknown')}")
        print(f"   版本: {api_info.get('version', 'Unknown')}")
        
        # 保存文件
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        
        # 1. 标准 OpenAPI 文件 (用于导入 Apifox)
        openapi_file = output_dir / "md2ppt_api_openapi.json"
        with open(openapi_file, 'w', encoding='utf-8') as f:
            json.dump(openapi_data, f, ensure_ascii=False)
        print(f"📄 已保存: {openapi_file}")
        
        # 2. 格式化版本 (便于阅读)
        formatted_file = output_dir / "md2ppt_api_formatted.json"
        with open(formatted_file, 'w', encoding='utf-8') as f:
            json.dump(openapi_data, f, ensure_ascii=False, indent=2)
        print(f"📄 已保存: {formatted_file}")
        
        # 3. 备份文件
        backup_file = output_dir / f"backup_api_{timestamp}.json"
        with open(backup_file, 'w', encoding='utf-8') as f:
            json.dump(openapi_data, f, ensure_ascii=False, indent=2)
        print(f"💾 已保存备份: {backup_file}")
        
        # 4. 生成导入说明
        guide_content = f"""# MD2PPT API 导入 Apifox 指南

## 📊 API 信息

- **名称**: {api_info.get('title', 'MD2PPT API')}
- **版本**: {api_info.get('version', '1.0.0')}
- **同步时间**: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}

## 🚀 Apifox 导入步骤

1. **打开 Apifox** → 选择项目
2. **导入 API** → 选择 OpenAPI/Swagger 格式
3. **上传文件** → 选择 `md2ppt_api_openapi.json`
4. **确认设置** → 建议选择"覆盖"模式
5. **完成导入** → 开始测试接口

## 📁 文件说明

- `md2ppt_api_openapi.json` - **主要文件，用于导入 Apifox**
- `md2ppt_api_formatted.json` - 格式化版本，便于查看
- `backup_api_{timestamp}.json` - 带时间戳的备份

## 🔧 环境配置

在 Apifox 中设置环境变量：

```json
{{
  "base_url": "{base_url}",
  "api_version": "v1"
}}
```

## 🧪 快速测试

1. **健康检查**: `GET /health`
2. **转换测试**: `POST /api/v1/convert`
3. **文件上传**: `POST /api/v1/convert/upload`

## 🔄 重新同步

当 API 有更新时：

```bash
python scripts/simple_api_sync.py
```

---
*文档生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}*
"""
        
        guide_file = output_dir / "apifox_import_guide.md"
        with open(guide_file, 'w', encoding='utf-8') as f:
            f.write(guide_content)
        print(f"📖 已生成: {guide_file}")
        
        print(f"\n🎉 同步完成！")
        print(f"📁 输出目录: {output_dir.absolute()}")
        print(f"🚀 下一步: 在 Apifox 中导入 {openapi_file.name}")
        
        return True
        
    except requests.exceptions.ConnectionError:
        print(f"❌ 无法连接到 API 服务器: {base_url}")
        print("请确保 MD2PPT API 服务正在运行:")
        print("  python -m uvicorn api.app:app --port 8001")
        return False
    except requests.exceptions.RequestException as e:
        print(f"❌ 请求失败: {e}")
        return False
    except Exception as e:
        print(f"❌ 同步失败: {e}")
        return False

def main():
    parser = argparse.ArgumentParser(description="简化版 MD2PPT API 同步工具")
    parser.add_argument('--url', default='http://localhost:8001', help='API 服务器地址')
    parser.add_argument('--output', default='./api_docs', help='输出目录')
    
    args = parser.parse_args()
    
    print("🔄 MD2PPT API 简化同步工具")
    print(f"🎯 目标服务器: {args.url}")
    
    success = fetch_and_save_openapi(args.url, args.output)
    sys.exit(0 if success else 1)

if __name__ == "__main__":
    main()